package com.jl15988.mybatispluskit.join.injector;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinCount;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinLambdaCount;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinLambdaList;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinLambdaMaps;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinLambdaOne;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinList;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinMaps;
import com.jl15988.mybatispluskit.join.injector.methods.SelectJoinOne;

import java.util.List;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

/**
 * 关联查询 SQL 注入器
 * 用于向 MyBatis-Plus 注入自定义的关联查询方法
 * 
 * @author Jalon
 * @since 2025/1/1
 */
public class JoinSqlInjector extends DefaultSqlInjector {
    
    /**
     * 获取方法列表
     * 在默认方法基础上添加关联查询方法
     * 
     * @param mapperClass Mapper 类
     * @param tableInfo 表信息
     * @return 方法列表
     */
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        // 获取默认方法列表
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);
        
        // 添加关联查询方法
        methodList.addAll(Stream.of(
                new SelectJoinList(),
                new SelectJoinLambdaList(),
                new SelectJoinOne(),
                new SelectJoinLambdaOne(),
                new SelectJoinCount(),
                new SelectJoinLambdaCount(),
                new SelectJoinMaps(),
                new SelectJoinLambdaMaps()
        ).collect(toList()));
        
        return methodList;
    }
} 